class Solution {
public:
    string rankTeams(vector<string>& votes) {
        // 由题意得，因为1 <= votes[i].length <= 26，votes[i][j] 都是英文大写字母
        // 所以，最多有 26 个选手，排名也最多 26 名
        array<array<int, 26>, 26> hash;
        int n = votes[0].size();
        for(auto &v : votes)
            for(int i = 0; i < n; i++)
                hash[v[i] - 'A'][i]++;      // 哪位选手的哪个名次增加 1
        
        string s = votes[0];
        // ranges::sort(s, [&](char &a, char &b){
        sort(s.begin(), s.end(), [&](char &a, char &b){
            int x = a - 'A', y = b - 'A';
            for(int i = 0; i < n; i++)
            {
                if(hash[x][i] != hash[y][i])    // 比较每个名次的票数
                    return hash[x][i] > hash[y][i];
            }
            return x < y;       // 票数都相同就按字母 ASCII 码从小到大排序
        });

        return string(s.begin(), s.end());
    }
};